/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cl.alanis.business;

import cl.alanis.dao.NotaCreditoDao;
import cl.alanis.dao.ProductoDao;
import cl.alanis.dao.StockDao;
import cl.alanis.dao.VentaDao;
import cl.alanis.dao.impl.NotaCreditoDaoImpl;
import cl.alanis.dao.impl.ProductoDaoImpl;
import cl.alanis.dao.impl.StockDaoImpl;
import cl.alanis.dao.impl.VentaDaoImpl;
import cl.alanis.dto.NotaCreditoDto;
import cl.alanis.dto.ProductoDto;
import cl.alanis.dto.StockDto;
import cl.alanis.dto.VentaDto;
import cl.alanis.exception.StockNoExisteException;
import cl.alanis.exception.StockVendidoException;
import cl.alanis.exception.VentaExisteException;
import cl.alanis.util.AlanisLog;
import cl.alanis.util.Constantes;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.apache.log4j.Logger;

/**
 *
 * @author nicolas
 */
public class VentaBusiness {
    VentaDao daoVenta;
    StockDao daoStock;
    VentaDto ventaConsulta;
    ProductoDao daoProducto;
    NotaCreditoDao daoNotaCredito;
    Logger logger=AlanisLog.obtenerLogger(VentaBusiness.class);
    public void generaVenta(VentaDto venta,StockDto[] stocks) throws Exception{
        daoVenta=new VentaDaoImpl();
        daoStock=new StockDaoImpl();
        Integer codigo = null;
        StockDto stock;
        try {
             ventaConsulta=daoVenta.obtenerVenta(venta);
             if(ventaConsulta==null){
                codigo=daoVenta.generaCodigo();
                venta.setCodVenta(codigo);
                daoVenta.insertarVenta(venta);
                for(int i=0;i<stocks.length;i++){
                    stock=daoStock.obtenerStock(stocks[i]);
                    stock.setCodVenta(codigo);
                    daoStock.actualizarStock(stock);
                }
                daoVenta.commit();     
             } 
             else 
                 throw new VentaExisteException("El numero de boleta "+venta.getNumBoleta()+" ya fue ingresado");
        } catch (StockNoExisteException ex) {
            daoVenta.rollback();
           logger.error("Error:"+ex);
           throw ex;
        } catch (Exception ex) {
            daoVenta.rollback();
            logger.error("Error:"+ex.getMessage());
             throw ex;
        }
       
       
        
       
    }
    
    public Object[] obtenerFilaTablaAnulaVenta(StockDto stock) throws StockNoExisteException,Exception{
        StockDto stockRetorno;
        ProductoDto productoRetorno;
        daoStock=new StockDaoImpl();
        daoVenta=new VentaDaoImpl();
        daoProducto=new ProductoDaoImpl();
        try {
             stockRetorno=daoStock.obtenerStock(stock);
             ProductoDto producto=new ProductoDto();
             producto.setCodProducto(stock.getCodProducto());
             productoRetorno=daoProducto.obtenerProducto(producto);
        }catch(StockNoExisteException e){ 
            logger.debug(e.getMessage());
            throw e;
        }catch (SQLException ex) {
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error al obtener Stock");
        }
        ProductoDto producto=new ProductoDto();
        producto.setCodProducto(stockRetorno.getCodProducto());
        producto=daoProducto.obtenerProducto(producto);        
        Object[] retorno=new Object[]{stock.getCodStock(), producto.getDescripcionProducto(),Math.ceil(productoRetorno.getValorVenta()*(1+Constantes.IVA))};
        return retorno;
    }
    
    public Object[] obtenerFilaTablaVenta(StockDto stock) throws StockNoExisteException,Exception{
        StockDto stockRetorno;
        daoStock=new StockDaoImpl();
        daoProducto=new ProductoDaoImpl();
        try {
             stockRetorno=daoStock.obtenerStock(stock);
            if(stockRetorno.getCodVenta()!=0) 
                throw new StockVendidoException("El Producto ingresado ya fue vendido");   
        }catch(StockNoExisteException e){ 
            logger.debug(e.getMessage());
            throw e;
        }
        ProductoDto producto=new ProductoDto();
        producto.setCodProducto(stockRetorno.getCodProducto());
        producto=daoProducto.obtenerProducto(producto);
        Object[] retorno=new Object[]{stock.getCodStock(), producto.getNombreProducto(),producto.getValorVenta(),producto.getValorVenta()*0.19,producto.getValorVenta()*1.19};
        return retorno;
    }
    public VentaDto obtenerVenta(VentaDto venta) throws Exception  {
        VentaDto ventaRetorno = null;
        daoVenta=new VentaDaoImpl();
        daoStock=new StockDaoImpl();
        List stocks;
        try {
            ventaRetorno=daoVenta.obtenerVenta(venta);
            stocks=new ArrayList();
            stocks=daoStock.obtenerStocks(ventaRetorno);
            ventaRetorno.setStocks(stocks);
        } catch (Exception e) {
            logger.debug(e.getMessage());
            throw e;
        }
        return ventaRetorno;
    }
    public VentaDto obtenerVenta(StockDto stock) throws StockNoExisteException, Exception {
        daoStock=new StockDaoImpl();
        daoVenta=new VentaDaoImpl();
         StockDto  stockRetorno=new StockDto();
         VentaDto venta=new VentaDto();
         
        try {
           stockRetorno=daoStock.obtenerStock(stock);
           venta.setCodVenta(stockRetorno.getCodVenta());
           venta=daoVenta.obtenerVenta(venta);
           venta.setStocks(daoStock.obtenerStocks(venta));
        } catch (StockNoExisteException e) {
            logger.debug(e.getMessage());
            throw e;
        } catch (Exception ex) {
            
            logger.error("Error:"+ex.getMessage());
            throw new Exception("Error al obtener Stock");
        }
        
        return venta;
    }

    

    public void anularVenta(List stocks,NotaCreditoDto notaCredito) throws Exception {
        daoStock=new StockDaoImpl();
        daoVenta=new VentaDaoImpl();
        daoNotaCredito=new NotaCreditoDaoImpl();
        Iterator iterador=stocks.iterator();
        Integer codigoVenta;  
        StockDto stockRetorno;
        try {
            Integer codigo=daoNotaCredito.obtenerCodigo();
            notaCredito.setCodNotaCredito(codigo);
            daoNotaCredito.insertarNotaCredito(notaCredito);
            while(iterador.hasNext()){
                StockDto stock=(StockDto) iterador.next();                                
                stockRetorno=daoStock.obtenerStock(stock);
                stockRetorno.setCodNotaCredito(codigo);
                stockRetorno.setCodVenta(null);
                codigoVenta=stockRetorno.getCodVenta();
                daoStock.actualizarStock(stockRetorno);
            }
            VentaDto venta=new VentaDto();
            venta=daoVenta.obtenerVenta(venta);
            Double valorVenta=venta.getValorTotal();
            Float descuento=venta.getDescuento();
            Double valorNotaCreditoDescto=Math.ceil(notaCredito.getValor()*(1-descuento.doubleValue()));
            valorVenta-=valorNotaCreditoDescto;
            venta.setValorTotal(valorVenta);
            daoVenta.actualizarVenta(venta);
            daoNotaCredito.commit();
        } catch (Exception e) {
            daoNotaCredito.rollback();
            logger.error(e.getMessage());
            throw e;
        }
        
    }
    
}
